"
]
},
"metadata": {}
}
]
},
{
"cell_type": "code",
"source": [
"def plot_dataset(X, y):\n",
" plt.plot(X[:, 0][y==0], X[:, 1][y==0], \"bs\")\n",
" plt.plot(X[:, 0][y==1], X[:, 1][y==1], \"g^\")\n",
" #plt.axis(axes)\n",
" plt.grid(True, which='both')\n",
" plt.xlabel(\"$x_1$\")\n",
" plt.ylabel(\"$x_2$\", rotation=0)\n",
"\n",
"def plot_decision_boundary(clf, X, y, alpha=1.0):\n",
" axes=[-1.5, 2.4, -1, 1.5]\n",
" x1, x2 = np.meshgrid(np.linspace(axes[0], axes[1], 100),\n",
" np.linspace(axes[2], axes[3], 100))\n",
" X_new = np.c_[x1.ravel(), x2.ravel()]\n",
" y_pred = clf.predict(X_new).reshape(x1.shape)\n",
" \n",
" plt.contourf(x1, x2, y_pred, alpha=0.3 * alpha, cmap='Wistia')\n",
" plt.contour(x1, x2, y_pred, cmap=\"Greys\", alpha=0.8 * alpha)\n",
" colors = [\"#78785c\", \"#c47b27\"]\n",
" markers = (\"o\", \"^\")\n",
" for idx in (0, 1):\n",
" plt.plot(X[:, 0][y == idx], X[:, 1][y == idx],\n",
" color=colors[idx], marker=markers[idx], linestyle=\"none\")\n",
" plt.axis(axes)\n",
" plt.xlabel(r\"$x_1$\")\n",
" plt.ylabel(r\"$x_2$\", rotation=0)"
],
"metadata": {
"id": "ruWWKAR_Mz5P"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"## Voting classifier"
],
"metadata": {
"id": "LTrx75jqLcLg"
}
},
{
"cell_type": "markdown",
"source": [
"`Scikit-Learn` provides a `VotingClassifier` class that’s quite easy to use: just give it a list of name/predictor pairs, and use it like a normal classifier, that’s it! Let’s try it on the moons dataset (this is a toy dataset for binary classification in which the data points are shaped as two interleaving crescent moons). We will load and split the moons dataset into a training set and a test set, then we’ll create and train a voting classifier composed of three diverse classifiers:"
],
"metadata": {
"id": "PvL__u5fL5Sw"
}
},
{
"cell_type": "code",
"source": [
"X, y = make_moons(n_samples=500, noise=0.30, random_state=42)\n",
"X_train, X_test, y_train, y_test = train_test_split(X, y, random_state=42)\n",
"plot_dataset(X, y)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 281
},
"id": "-AB6jsQHLfpk",
"outputId": "f4b4489f-8b3b-4f2e-942a-49641835aa4a"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"
"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"Here we use [`SciKeras`](https://github.com/adriangb/scikeras) to wrap kerase model into `Scikit-Learn`."
],
"metadata": {
"id": "qmJ0_x9ezBAO"
}
},
{
"cell_type": "code",
"source": [
"def get_model():\n",
" model= keras.models.Sequential([keras.layers.Dense(30,activation='relu',input_shape=[2]),\n",
" keras.layers.Dense(20,activation='relu'),\n",
" keras.layers.Dense(1,activation='sigmoid')\n",
" ])\n",
" model.compile(optimizer='NAdam',loss='binary_crossentropy',metrics=['accuracy'])\n",
" return model"
],
"metadata": {
"id": "DSARLteqwsY-"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"dense_model = KerasClassifier(model=get_model, epochs=200, verbose=False)"
],
"metadata": {
"id": "mufRkMoGxOuu"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"voting_clf = VotingClassifier(\n",
" estimators=[\n",
" ('lr', LogisticRegression(random_state=42)),\n",
" ('rf', RandomForestClassifier(random_state=42)),\n",
" ('svc', SVC(random_state=42)),\n",
" ('dense', dense_model)\n",
" ]\n",
")\n",
"voting_clf.fit(X_train, y_train)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "z2-c2OA5M4aG",
"outputId": "133a4343-5ec0-45d7-e7f3-7b8330d9a83d"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"VotingClassifier(estimators=[('lr', LogisticRegression(random_state=42)),\n",
" ('rf', RandomForestClassifier(random_state=42)),\n",
" ('svc', SVC(random_state=42)),\n",
" ('dense',\n",
" KerasClassifier(epochs=200, model=, verbose=False))])"
]
},
"metadata": {},
"execution_count": 109
}
]
},
{
"cell_type": "markdown",
"source": [
"When you fit a `VotingClassifier`, it clones every estimator and fits the clones. The original estimators are available via the `estimators` attribute, while the fitted clones are available via the `estimators_` attribute. If you prefer a dict rather than a list, you can use `named_estimators` or `named_estimators_` instead. For example, let’s look at each fitted classifier’s accuracy on the test set:"
],
"metadata": {
"id": "HMfYwrvVNeH3"
}
},
{
"cell_type": "code",
"source": [
"for name, clf in voting_clf.named_estimators_.items():\n",
" print(name, \"=\", clf.score(X_test, y_test))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "1Y1o7PFQNIPg",
"outputId": "7853f87b-55f2-4ab1-8482-33fbef160914"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"lr = 0.864\n",
"rf = 0.896\n",
"svc = 0.896\n",
"dense = 0.896\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"When you call the voting classifier’s `predict()` method, it performs hard voting. For example, the voting classifier predicts class 1 for the first instance of the test set, because 3 out of 4 classifiers predict that class:"
],
"metadata": {
"id": "pcfc8mtjNywf"
}
},
{
"cell_type": "code",
"source": [
"voting_clf.predict(X_test[:1]), [clf.predict(X_test[:1]) for clf in voting_clf.estimators_]"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "2TrG5WLoNvGl",
"outputId": "26dedde2-204a-469f-d971-b87ad8dc555d"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"(array([1]), [array([1]), array([1]), array([0]), array([1])])"
]
},
"metadata": {},
"execution_count": 111
}
]
},
{
"cell_type": "markdown",
"source": [
"Now let’s look at the performance of the voting classifier on the test set:"
],
"metadata": {
"id": "FfwmQiZiN-7P"
}
},
{
"cell_type": "code",
"source": [
"voting_clf.score(X_test, y_test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "R-4gZYXnN3Q0",
"outputId": "c64c50e5-7c31-4e8b-d8c3-6ca1e6fb6021"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.88"
]
},
"metadata": {},
"execution_count": 112
}
]
},
{
"cell_type": "code",
"source": [
"plot_decision_boundary(voting_clf, X_train, y_train)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 285
},
"id": "vQznlFPfU6aY",
"outputId": "0fe2bafe-b182-4970-83fc-4ed8decdaf39"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"
"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"If all classifiers are able to estimate class probabilities (i.e., they all have a `predict_proba()` method), then you can tell `Scikit-Learn` to predict the class with the **highest class probability, averaged over all the individual classifiers.** This is called **soft voting**. It often achieves higher performance than hard voting because it gives more weight to highly confident votes. All you need to do is set the voting classifier’s voting hyperparameter to \"soft\", and ensure that all classifiers can estimate class probabilities. \n",
"\n",
"This is not the case for the SVC class by default, so you need to set its probability hyperparameter to True (this will make the SVC class use cross-validation to estimate class probabilities, slowing down training, and it will add a `predict_proba()` method). Let’s try that:"
],
"metadata": {
"id": "0OCmMXDAOEsI"
}
},
{
"cell_type": "code",
"source": [
"voting_clf.voting = \"soft\"\n",
"voting_clf.named_estimators[\"svc\"].probability = True\n",
"voting_clf.fit(X_train, y_train)\n",
"voting_clf.score(X_test, y_test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "tex4mcrIOBQ2",
"outputId": "5dde7cd6-8849-41c6-e165-5a21e7e2aa00"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.912"
]
},
"metadata": {},
"execution_count": 114
}
]
},
{
"cell_type": "markdown",
"source": [
"We reach 91.2% accuracy simply by using soft voting, not bad!"
],
"metadata": {
"id": "I__SqQ0lOdco"
}
},
{
"cell_type": "markdown",
"source": [
"For stacking neural ntwork model, you can refer to https://ensemble-pytorch.readthedocs.io/en/latest/ for more details."
],
"metadata": {
"id": "R7wMvsUO8t9V"
}
},
{
"cell_type": "markdown",
"source": [
"## Stacking"
],
"metadata": {
"id": "PBHcV002qZ1u"
}
},
{
"cell_type": "markdown",
"source": [
"`Scikit-Learn` provides two classes for stacking ensembles: `StackingClassifier` and `StackingRegressor`. For example, you can replace the `VotingClassifier` you used on the moons dataset with a `StackingClassifier`:"
],
"metadata": {
"id": "DP5DoUCdqbaN"
}
},
{
"cell_type": "code",
"source": [
"stacking_clf = StackingClassifier(\n",
" estimators=[\n",
" ('lr', LogisticRegression(random_state=42)),\n",
" ('rf', RandomForestClassifier(random_state=42)),\n",
" ('svc', SVC(probability=True, random_state=42))\n",
" ],\n",
" final_estimator=RandomForestClassifier(random_state=43),\n",
" cv=5 # number of cross-validation folds\n",
")\n",
"stacking_clf.fit(X_train, y_train)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "1rqpE6FZqlN1",
"outputId": "6de014a5-d7c7-4bac-d60b-6c42c6644494"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"StackingClassifier(cv=5,\n",
" estimators=[('lr', LogisticRegression(random_state=42)),\n",
" ('rf', RandomForestClassifier(random_state=42)),\n",
" ('svc', SVC(probability=True, random_state=42))],\n",
" final_estimator=RandomForestClassifier(random_state=43))"
]
},
"metadata": {},
"execution_count": 34
}
]
},
{
"cell_type": "markdown",
"source": [
"For each predictor, the stacking classifier will call `predict_proba()` if available, or it will fallback to `decision_function()` if available, or as a last resort it will call `predict()`. If you don’t provide a final estimator, `StackingClassifier` will use `LogisticRegression`, and `StackingRegressor` will use `RidgeCV`."
],
"metadata": {
"id": "08TA3D47qsWN"
}
},
{
"cell_type": "code",
"source": [
"stacking_clf.score(X_test, y_test)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "7ms6ZeGCq4_W",
"outputId": "6147afb3-260d-491c-d36c-dbe82cd0c620"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.928"
]
},
"metadata": {},
"execution_count": 35
}
]
},
{
"cell_type": "markdown",
"source": [
"You get 92.8% accuracy! which is a bit better than the voting classifier using soft voting, which got 92%."
],
"metadata": {
"id": "pIeOuOsOq_N-"
}
},
{
"cell_type": "markdown",
"source": [
"## Baaging and Pasting"
],
"metadata": {
"id": "I97bOx8CTlf3"
}
},
{
"cell_type": "markdown",
"source": [
"`Scikit-Learn` offers a simple API for both bagging and pasting with the `BaggingClassifier` class (or `BaggingRegressor` for regression). The following code trains an ensemble of 500 **Decision Tree classifiers**: each is trained on 100 training instances randomly sampled from the training set with replacement (this is an example of bagging, but if you want to use pasting instead, just set `bootstrap=False`). The `n_jobs` parameter tells `Scikit-Learn` the number of CPU cores to use for training and predictions, and –1 tells `Scikit-Learn` to use all available cores."
],
"metadata": {
"id": "QzERUKToTov_"
}
},
{
"cell_type": "code",
"source": [
"bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,\n",
" max_samples=100, random_state=42)\n",
"bag_clf.fit(X_train, y_train)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "x43B6MDAObRX",
"outputId": "5e4c6379-1a36-497d-a99f-f949e3e1c8fa"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"BaggingClassifier(base_estimator=DecisionTreeClassifier(), max_samples=100,\n",
" n_estimators=500, random_state=42)"
]
},
"metadata": {},
"execution_count": 13
}
]
},
{
"cell_type": "markdown",
"source": [
"Notice that the `BaggingClassifier` automatically performs **soft voting** instead of hard voting if the base classifier can estimate class probabilities (i.e., if it has a `predict_proba()` method), which is the case with Decision Tree classifiers."
],
"metadata": {
"id": "BF7-HM3KT99Q"
}
},
{
"cell_type": "markdown",
"source": [
"We compares the decision boundary of a single Decision Tree with the decision boundary of a bagging ensemble of 500 trees (from the preceding code), both trained on the moons dataset. As you can see, the ensemble’s predictions will likely generalize much better than the single Decision Tree’s predictions: the ensemble has a comparable bias but a smaller variance (it makes roughly the same number of errors on the training set, but the decision boundary is less irregular)."
],
"metadata": {
"id": "4lhj-r7nUMn3"
}
},
{
"cell_type": "code",
"source": [
"tree_clf = DecisionTreeClassifier(random_state=42)\n",
"tree_clf.fit(X_train, y_train)\n",
"\n",
"fig, axes = plt.subplots(ncols=2, figsize=(10, 4), sharey=True)\n",
"plt.sca(axes[0])\n",
"plot_decision_boundary(tree_clf, X_train, y_train)\n",
"plt.title(\"Decision Tree\")\n",
"plt.sca(axes[1])\n",
"plot_decision_boundary(bag_clf, X_train, y_train)\n",
"plt.title(\"Decision Trees with Bagging\")\n",
"plt.ylabel(\"\")\n",
"plt.show()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 297
},
"id": "8wOuoYCmUMG2",
"outputId": "cb3cf50f-611e-477e-cf95-6c10cd6c1df5"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"
"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"### Out-of-Bag evaluation"
],
"metadata": {
"id": "9HiUsZa_VGBw"
}
},
{
"cell_type": "markdown",
"source": [
"It can be shown mathematically that only about 63% of the training instances are sampled on average for each predictor.6 The remaining 37% of the training instances that are not sampled are called out-of-bag (oob) instances. Note that they are not the same 37% for all predictors. The following calculate this number when `m=1000`:"
],
"metadata": {
"id": "LXRxTOnAa2Ev"
}
},
{
"cell_type": "code",
"source": [
"print(1 - (1 - 1 / 1000) ** 1000)\n",
"print(1 - np.exp(-1))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "t_pOXuBaVRwI",
"outputId": "1104123d-7f8b-4160-f868-f6b17a2ee36c"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"0.6323045752290363\n",
"0.6321205588285577\n"
]
}
]
},
{
"cell_type": "markdown",
"source": [
"In `Scikit-Learn`, you can set `oob_score=True` when creating a `BaggingClassifier` to request an automatic oob evaluation after training. The following code demonstrates this. The resulting evaluation score is available in the `oob_score_` attribute:"
],
"metadata": {
"id": "aMg1xzaMVHfr"
}
},
{
"cell_type": "code",
"source": [
"bag_clf = BaggingClassifier(DecisionTreeClassifier(), n_estimators=500,\n",
" oob_score=True, n_jobs=-1, random_state=42)\n",
"bag_clf.fit(X_train, y_train)\n",
"bag_clf.oob_score_"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "MpOmKptvT65-",
"outputId": "418d2dc7-8f3e-4379-cf07-be3a423772cb"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.896"
]
},
"metadata": {},
"execution_count": 22
}
]
},
{
"cell_type": "markdown",
"source": [
"According to this oob evaluation, this `BaggingClassifier` is likely to achieve about 89.6% accuracy on the test set. Let’s verify this:"
],
"metadata": {
"id": "qjCSrZaaakSn"
}
},
{
"cell_type": "code",
"source": [
"y_pred = bag_clf.predict(X_test)\n",
"accuracy_score(y_test, y_pred)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "C5GIYPd1an13",
"outputId": "65ebf350-b3f7-4885-cd6b-3ef10aa70a76"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.92"
]
},
"metadata": {},
"execution_count": 27
}
]
},
{
"cell_type": "markdown",
"source": [
"We get 92% accuracy on the test. The oob evaluation was a bit too pessimistic, a bit over 2% too low."
],
"metadata": {
"id": "OmiahqHWaqqo"
}
},
{
"cell_type": "markdown",
"source": [
"The `BaggingClassifier` class supports **sampling the features** as well. Sampling is controlled by two hyperparameters: `max_features` and `bootstrap_features`. They work the same way as `max_samples` and `bootstrap`, but for feature sampling instead of instance sampling. Thus, each predictor will be trained on a random subset of the input features.\n",
"\n",
"This technique is particularly useful when you are dealing with high-dimensional inputs (such as images). **Sampling both training instances and features is called the Random Patches method**. Keeping all training instances (by setting `bootstrap=False` and `max_samples=1.0`) but sampling features (by setting `bootstrap_features` to True and/or `max_features` to a value smaller than 1.0) is called the **Random Subspaces method**."
],
"metadata": {
"id": "rva-jGH6bOmw"
}
},
{
"cell_type": "markdown",
"source": [
"### Random forest"
],
"metadata": {
"id": "9oWyFDYpdIwf"
}
},
{
"cell_type": "markdown",
"source": [
"Random Forest9 is an ensemble of Decision Trees, generally trained via the bagging method (or sometimes pasting), **typically with `max_samples` set to the size of the training set.** Instead of building a `BaggingClassifier` and passing it a `DecisionTreeClassifier`, you can use the `RandomForestClassifier` class, which is more convenient and **optimized for Decision Trees** (similarly, there is a `RandomForestRegressor` class for regression tasks). The follwong `BaggingClassifier` is equivalent to random forest\n",
"\n",
"```python\n",
"bag_clf = BaggingClassifier(\n",
" DecisionTreeClassifier(max_features=\"sqrt\", max_leaf_nodes=16),\n",
" n_estimators=500, n_jobs=-1, random_state=42)\n",
"```\n",
"\n",
"The following code trains a Random Forest classifier with 500 trees, each limited to maximum 16 nodes, and using all available CPU cores:"
],
"metadata": {
"id": "j_TkqrLMdMT4"
}
},
{
"cell_type": "code",
"source": [
"rnd_clf = RandomForestClassifier(n_estimators=500, max_leaf_nodes=16, n_jobs=-1, random_state=42)\n",
"rnd_clf.fit(X_train, y_train)\n",
"y_pred_rf = rnd_clf.predict(X_test)"
],
"metadata": {
"id": "rBo1gB1MVWwI"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "code",
"source": [
"y_pred = rnd_clf.predict(X_test)\n",
"accuracy_score(y_test, y_pred)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "X5-UVNb5jk-H",
"outputId": "63b8fb73-d95f-47f4-dcb5-fe0150c9e8d9"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"0.912"
]
},
"metadata": {},
"execution_count": 31
}
]
},
{
"cell_type": "markdown",
"source": [
"You can also create an Extra-Trees classifier using `Scikit-Learn`’s `ExtraTreesClassifier` class. Its API is identical to the `RandomForestClassifier` class, except bootstrap defaults to False. Similarly, the `ExtraTreesRegressor` class has the same API as the RandomForestRegressor class, except bootstrap defaults to False."
],
"metadata": {
"id": "9x22GreAfOSv"
}
},
{
"cell_type": "markdown",
"source": [
"## AdaBoost"
],
"metadata": {
"id": "Ro3Mdc0UjuAe"
}
},
{
"cell_type": "markdown",
"source": [
"Scikit-Learn uses a multiclass version of AdaBoost called `SAMME` (which stands for Stagewise Additive Modeling using a Multiclass Exponential loss function). When there are just two classes, SAMME is equivalent to AdaBoost. If the predictors can estimate class probabilities (i.e., if they have a `predict_proba()` method), Scikit-Learn can use a variant of SAMME called SAMME.R (the R stands for “Real”), which relies on class probabilities rather than predictions and generally performs better."
],
"metadata": {
"id": "bS8rugGHkMov"
}
},
{
"cell_type": "markdown",
"source": [
"The following code trains an AdaBoost classifier based on 30 Decision Stumps using `Scikit-Learn`’s `AdaBoostClassifier` class (as you might expect, there is also an `AdaBoostRegressor` class). A Decision Stump is a Decision Tree with `max_depth=1`—in other words, **a tree composed of a single decision node** plus two leaf nodes. This is the default base estimator for the `AdaBoostClassifier` class:"
],
"metadata": {
"id": "Pmgz2OtNkX-n"
}
},
{
"cell_type": "code",
"source": [
"ada_clf = AdaBoostClassifier(\n",
" DecisionTreeClassifier(max_depth=1), n_estimators=30,\n",
" learning_rate=0.5, random_state=42)\n",
"ada_clf.fit(X_train, y_train)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "aDhLJhmhdfw2",
"outputId": "7b365b79-8e1d-4ac6-ab4a-8dcd7433cf96"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"AdaBoostClassifier(base_estimator=DecisionTreeClassifier(max_depth=1),\n",
" learning_rate=0.5, n_estimators=30, random_state=42)"
]
},
"metadata": {},
"execution_count": 115
}
]
},
{
"cell_type": "code",
"source": [
"plot_decision_boundary(ada_clf, X_train, y_train)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 285
},
"id": "Gsh_380VkHX_",
"outputId": "20d453fc-efc5-4ea5-c391-af74e94502fd"
},
"execution_count": null,
"outputs": [
{
"output_type": "display_data",
"data": {
"text/plain": [
"
"
],
"image/png": "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\n"
},
"metadata": {
"needs_background": "light"
}
}
]
},
{
"cell_type": "markdown",
"source": [
"## Gradient Boosting"
],
"metadata": {
"id": "91HFYHBB-Bmv"
}
},
{
"cell_type": "markdown",
"source": [
"First, let’s generate a noisy quadratic dataset and fit a `DecisionTreeRegressor`to it:"
],
"metadata": {
"id": "2uM9bAyb-D1m"
}
},
{
"cell_type": "code",
"source": [
"np.random.seed(42)\n",
"X = np.random.rand(100, 1) - 0.5\n",
"y = 3 * X[:, 0] ** 2 + 0.05 * np.random.randn(100) # y = 3x² + Gaussian noise\n",
"\n",
"tree_reg1 = DecisionTreeRegressor(max_depth=2, random_state=42)\n",
"tree_reg1.fit(X, y)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "LgoG2Cg58-oC",
"outputId": "a702998b-7ece-466f-a438-3d2ada3b4f24"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"DecisionTreeRegressor(max_depth=2, random_state=42)"
]
},
"metadata": {},
"execution_count": 119
}
]
},
{
"cell_type": "markdown",
"source": [
"A simpler way to train GBRT ensembles is to use Scikit-Learn’s `GradientBoostingRegressor` class (there’s also a `GradientBoostingClassifier` class for classification). Much like the `RandomForestRegressor` class, it has hyperparameters to control the growth of Decision Trees (e.g., `max_depth`, `min_samples_leaf`), as well as hyperparameters to control the ensemble training, such as the number of trees (`n_estimator`s). "
],
"metadata": {
"id": "PXBmpTZ6-TUf"
}
},
{
"cell_type": "code",
"source": [
"gbrt = GradientBoostingRegressor(max_depth=2, n_estimators=3, learning_rate=1.0, random_state=42)\n",
"gbrt.fit(X, y)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QUJv2gs2-pmE",
"outputId": "016aca12-5341-403d-ede4-03d9ddf357ad"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"GradientBoostingRegressor(learning_rate=1.0, max_depth=2, n_estimators=3,\n",
" random_state=42)"
]
},
"metadata": {},
"execution_count": 122
}
]
},
{
"cell_type": "markdown",
"source": [
"The `learning_rate` hyperparameter scales the contribution of each tree. If you set it to a low value, such as 0.05, you will need more trees in the ensemble to fit the training set, but the predictions will usually generalize better. This is a regularization technique called shrinkage.\n",
"\n",
"To find the optimal number of trees, you could perform cross-validation using `GridSearchCV` or `RandomizedSearchCV`, as usual, but there’s a simpler way: if you set the `n_iter_no_change` hyperparameter to an integer value, say 10, then the `GradientBoostingRegressor` will automatically stop adding more trees during training if it sees that the last 10 trees didn’t help. This is simply early stopping, but with a little bit of patience: it tolerates having no progress for a few iterations before it stops. Let’s train the ensemble using early stopping:"
],
"metadata": {
"id": "HONBXa5P--iv"
}
},
{
"cell_type": "code",
"source": [
"gbrt_best = GradientBoostingRegressor(\n",
" max_depth=2, learning_rate=0.05, n_estimators=500,\n",
" n_iter_no_change=10, random_state=42)\n",
"gbrt_best.fit(X, y)"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "hSZK_Cvb-zke",
"outputId": "c4b43dca-b453-4619-c547-b0bb44bb4c50"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"GradientBoostingRegressor(learning_rate=0.05, max_depth=2, n_estimators=500,\n",
" n_iter_no_change=10, random_state=42)"
]
},
"metadata": {},
"execution_count": 123
}
]
},
{
"cell_type": "markdown",
"source": [
"If you set `n_iter_no_change` too low, training may stop too early and the model will underfit. But if you set it too high, it will overfit instead. We also set a fairly small learning rate and a high number of estimators, but the actual number of estimators in the trained ensemble is much lower, thanks to early stopping:"
],
"metadata": {
"id": "-JbdlvKh_hwO"
}
},
{
"cell_type": "code",
"source": [
"gbrt_best.n_estimators_"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "8zloEgk6_UJj",
"outputId": "77810466-8ed3-4d26-848c-2faea98bc8b4"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"92"
]
},
"metadata": {},
"execution_count": 124
}
]
},
{
"cell_type": "markdown",
"source": [
"When `n_iter_no_change` is set, the `fit(`) method automatically splits the training set into a smaller training set and a validation set: this allows it to evaluate the model’s performance each time it adds a new tree. The size of the validation set is controlled by the `validation_fraction` hyperparameter, which is 10% by default. The tol hyperparameter determines the maximum performance improvement that still counts as negligible. It defaults to 0.0001."
],
"metadata": {
"id": "L-vULKsT_mEO"
}
},
{
"cell_type": "markdown",
"source": [
"The GradientBoostingRegressor class also supports a subsample hyperparameter, which specifies the fraction of training instances to be used for training each tree. For example, if `subsample=0.25`, then each tree is trained on 25% of the training instances, selected randomly. As you can probably guess by now, this technique trades a higher bias for a lower variance. It also speeds up training considerably. This is called **Stochastic Gradient Boosting**."
],
"metadata": {
"id": "E8JMjIRF_xdd"
}
},
{
"cell_type": "markdown",
"source": [
"## XGBoost"
],
"metadata": {
"id": "KHUBGzQqZRhM"
}
},
{
"cell_type": "markdown",
"source": [
"### Classification task"
],
"metadata": {
"id": "HIsGDU0-bB-a"
}
},
{
"cell_type": "markdown",
"source": [
"Here are the essential steps to build an XGBoost classification model in scikit-learn using cross-validation."
],
"metadata": {
"id": "l41vqfEkbKcK"
}
},
{
"cell_type": "code",
"source": [
"iris = datasets.load_iris()\n",
"df = pd.DataFrame(data= np.c_[iris['data'], iris['target']],columns= iris['feature_names'] + ['target'])\n",
"df.head()"
],
"metadata": {
"id": "ZVg6wzfA_Vyq",
"colab": {
"base_uri": "https://localhost:8080/",
"height": 206
},
"outputId": "6a21e676-4e2b-44e6-f754-6b1c55ed0d58"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" sepal length (cm) sepal width (cm) petal length (cm) petal width (cm) \\\n",
"0 5.1 3.5 1.4 0.2 \n",
"1 4.9 3.0 1.4 0.2 \n",
"2 4.7 3.2 1.3 0.2 \n",
"3 4.6 3.1 1.5 0.2 \n",
"4 5.0 3.6 1.4 0.2 \n",
"\n",
" target \n",
"0 0.0 \n",
"1 0.0 \n",
"2 0.0 \n",
"3 0.0 \n",
"4 0.0 "
],
"text/html": [
"\n",
"
\n",
"
\n",
"
\n",
"\n",
"
\n",
" \n",
"
\n",
"
\n",
"
sepal length (cm)
\n",
"
sepal width (cm)
\n",
"
petal length (cm)
\n",
"
petal width (cm)
\n",
"
target
\n",
"
\n",
" \n",
" \n",
"
\n",
"
0
\n",
"
5.1
\n",
"
3.5
\n",
"
1.4
\n",
"
0.2
\n",
"
0.0
\n",
"
\n",
"
\n",
"
1
\n",
"
4.9
\n",
"
3.0
\n",
"
1.4
\n",
"
0.2
\n",
"
0.0
\n",
"
\n",
"
\n",
"
2
\n",
"
4.7
\n",
"
3.2
\n",
"
1.3
\n",
"
0.2
\n",
"
0.0
\n",
"
\n",
"
\n",
"
3
\n",
"
4.6
\n",
"
3.1
\n",
"
1.5
\n",
"
0.2
\n",
"
0.0
\n",
"
\n",
"
\n",
"
4
\n",
"
5.0
\n",
"
3.6
\n",
"
1.4
\n",
"
0.2
\n",
"
0.0
\n",
"
\n",
" \n",
"
\n",
"
\n",
" \n",
" \n",
" \n",
"\n",
" \n",
"
\n",
"
\n",
" "
]
},
"metadata": {},
"execution_count": 38
}
]
},
{
"cell_type": "code",
"source": [
"X_train, X_test, y_train, y_test = train_test_split(iris['data'], iris['target'], random_state=42)"
],
"metadata": {
"id": "G3R0nCm-Z4ly"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"The following template is for building an XGBoost classifier"
],
"metadata": {
"id": "Q6wn7paXZpj-"
}
},
{
"cell_type": "code",
"source": [
"xgb = XGBClassifier(booster='gbtree', objective='multi:softprob', \n",
" learning_rate=0.1, n_estimators=100, random_state=42, n_jobs=-1)"
],
"metadata": {
"id": "rsjJb0POZ8Y7"
},
"execution_count": null,
"outputs": []
},
{
"cell_type": "markdown",
"source": [
"1. `booster='gbtree'`: The booster is the base learner. It's the machine learning model that is constructed during every round of boosting. You may have guessed that 'gbtree' stands for gradient boosted tree, the XGBoost default base learner. It's uncommon but possible to work with other base learners, \n",
"\n",
"2. `objective='multi:softprob'`: Standard options for the objective can be viewed in the XGBoost official documentation, https://xgboost.readthedocs.io/en/latest/parameter.html, under Learning Task Parameters. The multi:softprob objective is a standard alternative to binary:logistic when the dataset includes multiple classes. It computes the probabilities of classification and chooses the highest one. If not explicitly stated, XGBoost will often find the right objective for you.\n",
"\n",
"3. `max_depth=6`: The max_depth of a tree determines the number of branches each tree has. It's one of the most important hyperparameters in making balanced predictions. XGBoost uses a default of 6, unlike random forests, which don't provide a value unless explicitly programmed.\n",
"\n",
"3. `learning_rate=0.1`: Within XGBoost, this hyperparameter is often referred to as eta. This hyperparameter limits the variance by reducing the weight of each tree to the given percentage. \n",
"\n",
"4. `n_estimators=100`: Popular among ensemble methods, `n_estimators` is the number of boosted trees in the model. Increasing this number while decreasing `learning_rate` can lead to more robust results."
],
"metadata": {
"id": "rDCT_1p9aNBi"
}
},
{
"cell_type": "code",
"source": [
"xgb.fit(X_train, y_train)\n",
"y_pred = xgb.predict(X_test)\n",
"score = accuracy_score(y_pred, y_test)\n",
"print('Score: ' + str(score))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "QYLOzVdMazA5",
"outputId": "e270ed09-e3f4-4ade-d8df-cc3f1fd6433d"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"Score: 1.0\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"xgb.get_params()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "Q8LM-RkUQLDd",
"outputId": "cd49710a-45fa-4a2e-ce82-860b66c41fa0"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'base_score': 0.5,\n",
" 'booster': 'gbtree',\n",
" 'callbacks': None,\n",
" 'colsample_bylevel': 1,\n",
" 'colsample_bynode': 1,\n",
" 'colsample_bytree': 1,\n",
" 'early_stopping_rounds': None,\n",
" 'enable_categorical': False,\n",
" 'eval_metric': None,\n",
" 'gamma': 0,\n",
" 'gpu_id': -1,\n",
" 'grow_policy': 'depthwise',\n",
" 'importance_type': None,\n",
" 'interaction_constraints': '',\n",
" 'learning_rate': 0.1,\n",
" 'max_bin': 256,\n",
" 'max_cat_to_onehot': 4,\n",
" 'max_delta_step': 0,\n",
" 'max_depth': 6,\n",
" 'max_leaves': 0,\n",
" 'min_child_weight': 1,\n",
" 'missing': nan,\n",
" 'monotone_constraints': '()',\n",
" 'n_estimators': 100,\n",
" 'n_jobs': -1,\n",
" 'num_parallel_tree': 1,\n",
" 'objective': 'multi:softprob',\n",
" 'predictor': 'auto',\n",
" 'random_state': 42,\n",
" 'reg_alpha': 0,\n",
" 'reg_lambda': 1,\n",
" 'sampling_method': 'uniform',\n",
" 'scale_pos_weight': None,\n",
" 'subsample': 1,\n",
" 'tree_method': 'exact',\n",
" 'use_label_encoder': False,\n",
" 'validate_parameters': 1,\n",
" 'verbosity': None}"
]
},
"metadata": {},
"execution_count": 43
}
]
},
{
"cell_type": "markdown",
"source": [
"### Regression task"
],
"metadata": {
"id": "e4LM00_-bExu"
}
},
{
"cell_type": "markdown",
"source": [
"Here are the essential steps to build an XGBoost regression model in scikit-learn using cross-validation."
],
"metadata": {
"id": "7uFOM-SqbIZ6"
}
},
{
"cell_type": "code",
"source": [
"X,y = datasets.load_diabetes(return_X_y=True)\n",
"\n",
"xgb = XGBRegressor(booster='gbtree', objective='reg:squarederror', \n",
" learning_rate=0.1, n_estimators=100, random_state=42, n_jobs=-1)\n",
"\n",
"scores = cross_val_score(xgb, X, y, scoring='neg_mean_squared_error', cv=5)\n",
"\n",
"# Take square root of the scores\n",
"rmse = np.sqrt(-scores)\n",
"\n",
"# Display accuracy\n",
"print('RMSE:', np.round(rmse, 3))\n",
"\n",
"# Display mean score\n",
"print('RMSE mean: %0.3f' % (rmse.mean()))"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "q5w9Jclca8Gs",
"outputId": "7d67260e-3a04-4ba2-84f6-b95dc8227cf1"
},
"execution_count": null,
"outputs": [
{
"output_type": "stream",
"name": "stdout",
"text": [
"RMSE: [63.033 59.689 64.538 63.699 64.661]\n",
"RMSE mean: 63.124\n"
]
}
]
},
{
"cell_type": "code",
"source": [
"xgb.fit(X,y)\n",
"xgb.get_params()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/"
},
"id": "CbihBstGRQom",
"outputId": "ce8ceff2-0207-4fac-e3c4-050b039028ad"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
"{'base_score': 0.5,\n",
" 'booster': 'gbtree',\n",
" 'callbacks': None,\n",
" 'colsample_bylevel': 1,\n",
" 'colsample_bynode': 1,\n",
" 'colsample_bytree': 1,\n",
" 'early_stopping_rounds': None,\n",
" 'enable_categorical': False,\n",
" 'eval_metric': None,\n",
" 'gamma': 0,\n",
" 'gpu_id': -1,\n",
" 'grow_policy': 'depthwise',\n",
" 'importance_type': None,\n",
" 'interaction_constraints': '',\n",
" 'learning_rate': 0.1,\n",
" 'max_bin': 256,\n",
" 'max_cat_to_onehot': 4,\n",
" 'max_delta_step': 0,\n",
" 'max_depth': 6,\n",
" 'max_leaves': 0,\n",
" 'min_child_weight': 1,\n",
" 'missing': nan,\n",
" 'monotone_constraints': '()',\n",
" 'n_estimators': 100,\n",
" 'n_jobs': -1,\n",
" 'num_parallel_tree': 1,\n",
" 'objective': 'reg:squarederror',\n",
" 'predictor': 'auto',\n",
" 'random_state': 42,\n",
" 'reg_alpha': 0,\n",
" 'reg_lambda': 1,\n",
" 'sampling_method': 'uniform',\n",
" 'scale_pos_weight': 1,\n",
" 'subsample': 1,\n",
" 'tree_method': 'exact',\n",
" 'validate_parameters': 1,\n",
" 'verbosity': None}"
]
},
"metadata": {},
"execution_count": 50
}
]
},
{
"cell_type": "markdown",
"source": [
"Without a baseline of comparison, we have no idea what that score means. Converting the target column, `y`, into a pandas DataFrame with the `.describe()` method will give the quartiles and the general statistics of the predictor column, as follows:"
],
"metadata": {
"id": "HAY1SjZxboMz"
}
},
{
"cell_type": "code",
"source": [
"pd.DataFrame(y).describe()"
],
"metadata": {
"colab": {
"base_uri": "https://localhost:8080/",
"height": 300
},
"id": "F35eRsafbXnV",
"outputId": "93fd4504-2aba-439f-e9b1-d85ed4f768fb"
},
"execution_count": null,
"outputs": [
{
"output_type": "execute_result",
"data": {
"text/plain": [
" 0\n",
"count 442.000000\n",
"mean 152.133484\n",
"std 77.093005\n",
"min 25.000000\n",
"25% 87.000000\n",
"50% 140.500000\n",
"75% 211.500000\n",
"max 346.000000"
],
"text/html": [
"\n",
"